package com.zbkj.service.manager;

import com.zbkj.dal.entity.fund.UserQuotaChangeRecord;
import com.zbkj.dal.entity.system.SystemUserLevel;
import com.zbkj.dal.entity.user.UserQuotaAccount;
import com.zbkj.service.model.front.vo.fund.UserQuotaVO;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

public interface QuotaManager {

    /**
     * 查询用户额度账户信息
     *
     * @param userId userId
     * @return {@link UserQuotaAccount}
     */
    UserQuotaAccount userQuotaAccount(Integer userId);

    /**
     * 获取用户额度
     *
     * @param userId userId
     * @return UserQuotaVO
     */
    UserQuotaVO userQuota(Integer userId);

    /**
     * 下一等级信息
     *
     * @param currentLevel 当前等级
     * @return {@link SystemUserLevel}
     */
    SystemUserLevel nextLevelInfo(int currentLevel);

    /**
     * 根据额度获取等级
     *
     * @param totalQuota 额度
     * @return {@link SystemUserLevel}
     */
    SystemUserLevel level(BigDecimal totalQuota);

    /**
     * 当前等级信息
     *
     * @param currentLevel 当前等级
     * @return {@link SystemUserLevel}
     */
    SystemUserLevel currentLevelInfo(int currentLevel);

    /**
     * 等级标题
     *
     * @param levelIds 级别 ID
     * @return {@link Map}<{@link Integer},{@link String}>
     */
    Map<Integer, String> levelTitle(List<Integer> levelIds);

    /**
     * 添加额度
     *
     * @param userId     用户 ID
     * @param amount     金额
     * @param bizOrderNo 业务单号
     * @param changeType 业务类型
     */
    void addQuota(Integer userId, BigDecimal amount, String bizOrderNo, String changeType, String image, String remark);

    /**
     * 减少额度
     *
     * @param userId     用户 ID
     * @param amount     金额
     * @param bizOrderNo 业务单号
     * @param changeType 业务类型
     */
    void minusQuota(Integer userId, BigDecimal amount, String bizOrderNo, String changeType, String image, String remark);

    /**
     * 使用额度
     *
     * @param userId      用户 ID
     * @param tradeAmount 使用额度
     * @param bizOrderNo  业务单号
     * @param changeType  业务类型
     */
    void useQuota(Integer userId, BigDecimal tradeAmount, String bizOrderNo, String changeType, String image, String remark);

    /**
     * 退回额度
     *
     * @param userId      用户 ID
     * @param tradeAmount 返还额度
     * @param bizOrderNo  业务单号
     * @param changeType  业务类型
     */
    void quotaReturn(Integer userId, BigDecimal tradeAmount, String bizOrderNo, String changeType, String image, String remark);

    /**
     * 用户额度更改记录
     *
     * @param quotaNo 额度单号
     * @return {@link UserQuotaChangeRecord}
     */
    UserQuotaChangeRecord userQuotaChangeRecord(String quotaNo);
}
